 1.选择器
   
   source可以向多个channel同时写数据，所以也就产生了以何种方式向多个channel写的问题：
   replication(复制，缺省)。数据完整地发送到每一个channel；
   multiplexing（多路复用）。通过配置来按照一定的规则进行分发；
 
 2.复制选择器
   默认的选择器。
   属性                默认值       解释
   selector.type      replicating  replicating
   selector.optional     -         指定哪些channel是可选的，多个用空格分开
   a1.sources = r1
   a1.channels = c1 c2 c3
   a1.sources.r1.selector.type = replicating
   a1.sources.r1.channels = c1 c2 c3
   a1.sources.r1.selector.optional = c3
   上面这个例子中，c3配置成了可选的。向c3发送数据如果失败了会被忽略。c1和c2
没有配置成可选的，向c1和c2写数据失败会导致事务失败回滚。
 
 3.多路复用选择器
   
   属性                  默认值                 解释
   selector.type         replicating            组件类型，这个是： multiplexing 
   selector.header       flume.selector.header  想要进行匹配的header属性的名字
   selector.default       -                     指定一个默认的channel。如果没有被规则
                                                匹配到，默认会发到这个channel上
   selector.mapping.*     -                     一些匹配规则，具体参考下面的例子
   a1.sources = r1
   a1.channels = c1 c2 c3 c4
   a1.sources.r1.selector.type = multiplexing
   #以每个Event的header中的state这个属性的值作为选择channel的依据
   a1.sources.r1.selector.header = state    
   #如果state=CZ，则选择c1这个channel
   a1.sources.r1.selector.mapping.CZ = c1    
   #如果state=US，则选择c2 和 c3 这两个channel
   a1.sources.r1.selector.mapping.US = c2 c3  
   #默认使用c4这个channel
   a1.sources.r1.selector.default = c4 
 
 4.自定义选择器
   
   自定义选择器就是开发一个 org.apache.flume.ChannelSelector 接口的实现类。实现
类以及依赖的jar包在启动时候都必须放入Flume的classpath。
   属性          默认值  解释    
   selector.type  -      你写的自定义选择器的全限定类名，比如：
                         org.liyifeng.flume.channel.MyChannelSelector
   a1.sources = r1
   a1.channels = c1
   a1.sources.r1.selector.type = org.liyifeng.flume.channel.MyChannelSelector
 
 5.Sink组逻辑处理器
   
   可以把多个sink分成一个组， Sink组逻辑处理器可以对这同一个组里的几个sink进行
负载均衡 或者 其中一个sink发生故障后将输出Event的任务转移到其他的sink上。
   N个sink将Event输出到对应的N个目的地的，通过 Sink组逻辑处理器 可以把这N个
sink配置成负载均衡或者故障转移的工作方式：
   负载均衡是将channel里面的Event，按照配置的负载机制（比如轮询）分别发
送到sink各自对应的目的地
   故障转移是这N个sink同一时间只有一个在工作，其余的作为备用，工作的sink
挂掉之后备用的sink顶上
   属性            默认值   解释 
   sinks            -       这一组的所有sink名，多个用空格分开
   processor.type default   这个sink组的逻辑处理器类型，可选值 default
                         (默认一对一的)、failover(故障转移)、load_balance(负载均衡)
   a1.sinkgroups = g1
   a1.sinkgroups.g1.sinks = k1 k2
   a1.sinkgroups.g1.processor.type = load_balance
   1).默认
   默认的组逻辑处理器就是只有一个sink的情况，这种情况就没必要配置sink组了。前
面的例子都是 source - channel - sink这种一对一，单个sink的。
   2).故障转移
   故障转移组逻辑处理器维护了一个发送Event失败的sink的列表，保证有一个sink是
可用的来发送Event。
   故障转移机制的工作原理是将故障sink降级到一个池中，在池中为它们分配冷却期
（超时时间），在重试之前随顺序故障而增加。 Sink成功发送事件后，它将恢复到
实时池。sink具有与之相关的优先级，数值越大，优先级越高。 如果在发送Event时
Sink发生故障，会继续尝试下一个具有最高优先级的sink。 例如，在优先级为80的
sink之前激活优先级为100的sink。如果未指定优先级，则根据配置中的顺序来选取。
   
   要使用故障转移选择器，不仅要设置sink组的选择器为failover，还有为每一个sink
设置一个唯一的优先级数值。 可以使用 maxpenalty 属性设置故障转移时间的上限
（毫秒）。
   属性                  默认值   解释 
   sinks                  -       这一组的所有sink名，多个用空格分开
   processor.type        default   组件类型，这个是： failover
   processor.priority.     -      组内sink的权重值，<sinkName>必须是当前组关
   <sinkName>                     联的sink之一。数值越大越被优先使用  
   processor.maxpenalty  30000    发生异常的sink最大故障转移时间（毫秒）
   a1.sinkgroups = g1
   a1.sinkgroups.g1.sinks = k1 k2
   a1.sinkgroups.g1.processor.type = failover
   a1.sinkgroups.g1.processor.priority.k1 = 5
   a1.sinkgroups.g1.processor.priority.k2 = 10
   a1.sinkgroups.g1.processor.maxpenalty = 10000
   3).负载均衡
   负载均衡Sink 选择器提供了在多个sink上进行负载均衡流量的功能。 它维护一个活
动sink列表的索引来实现负载的分配。 支持轮询（ round_robin ）【默认值】和随
机（ random ）两种选择机制分配负载。
   工作时，此选择器使用其配置的选择机制选择下一个sink并调用它。 如果所选sink无
法正常工作，则处理器通过其配置的选择机制选择下一个可用sink。 此实现不会将
失败的Sink列入黑名单，而是继续乐观地尝试每个可用的Sink。
   如果所有sink调用都失败了，选择器会将故障抛给sink的运行器。
   如果 backoff 设置为true则启用了退避机制，失败的sink会被放入黑名单，达到一定
的超时时间后会自动从黑名单移除。 如从黑名单出来后sink仍然失败，则再次进入
黑名单而且超时时间会翻倍，以避免在无响应的sink上浪费过长时间。 如果没有启
用退避机制，在禁用此功能的情况下，发生sink传输失败后，会将本次负载传给下一
个sink继续尝试，因此这种情况下是不均衡的。
   属性                  默认值   解释 
   processor.sinks        -       这一组的所有sink名，多个用空格分开
   processor.type        default  组件类型，这个是： load_balance
   processor.backoff      false   失败的sink是否成倍地增加退避它的时间。如果 
                                  设置为false,负载均衡在某一个sink发生异常后，
								  下一次选择sink的时候仍然会将失败的这个sink
								  加入候选队列；如果设置为true，某个sink连续
								  发生异常时会成倍地增加它的退避时间，在退避
								  的时间内是无法参与负载均衡竞争的。退避机制
								  只统计1个小时发生的异常，超过1个小时没有发
								  生异常就会重新计算
   processor.selector round_robin 负载均衡机制，可选值:round_robin(轮询)、random
                                  (随机选择)、「自定义选择器的全限定类名」:
								  自定义的负载器要继承 AbstractSinkSelector
   processor.selector   30000     发生异常的sink最长退避时间（毫秒）如果设置了
   .maxTimeOut                    processor.backoff=true,某一个sink发生异常的时候
                                  就会触发自动退避它一段时间,这个 maxTimeOut 就是
								  退避一个sink的最长时间
   
   a1.sinkgroups = g1
   a1.sinkgroups.g1.sinks = k1 k2
   a1.sinkgroups.g1.processor.type = load_balance
   a1.sinkgroups.g1.processor.backoff = true
   a1.sinkgroups.g1.processor.selector = random